package xyz.eden.boot.core.json;//package xyz.eden.boot.common.base.json;
//
//import cn.hutool.core.lang.TypeReference;
//import cn.hutool.json.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//
//import java.lang.reflect.Type;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author gavin
// * @version 1.0
// * @descriptor
// * @date 2023/3/2 14:30
// */
//@Slf4j
//public class JsonToolByJackson {
//    /**
//     * 属性为null时参与序列化的mapper
//     */
//    private static ObjectMapper mapper = null;
//    /**
//     * 属性为null时不序列化的mapper
//     */
//    private static ObjectMapper mapperWithoutNull = null;
//
//    public static <T> T json2Object(String json, Class<T> clazz) {
//        try {
//            return json2ObjectThrowException(json, clazz);
//        } catch (Exception e) {
//            log.error("json2Object error, json = {}", json, e);
//            return null;
//        }
//    }
//
//    public static <T> T json2Object(String json, TypeReference<T> typeRef) {
//        if (typeRef == null)
//            throw new NullPointerException("typeReference is null");
//        Type type = typeRef.getType();
//        try {
//            return readValue(json, type);
//        } catch (Exception e) {
//            log.error("json2Object error, json = {}", json, e);
//            return null;
//        }
//    }
//
//    public static <T> T json2ObjectThrowException(String json, Class<T> clazz) throws Exception {
//        try {
//            return readValue(json, clazz);
//        } catch (Exception e) {
//            log.error("json2ObjectThrowException error, json = {}", json, e);
//            throw e;
//        }
//    }
//
//    /**
//     * 原containsNull=true无意义，因为设为false时，map.get(key)也为null。因此containNull应该为false
//     *
//     * @param json
//     * @return
//     */
//    public static <K, V> Map<K, V> json2Map(String json) {
//        if (StringUtils.isBlank(json)) {
//            return null;
//        }
//        return json2Object(json, new TypeReference<Map<K, V>>() {
//        });
//    }
//
//    public static <T> List<T> json2List(String json, Class<T> clazz) {
//        if (StringUtils.isBlank(json)) {
//            return Collections.emptyList();
//        }
//        try {
//            ObjectMapper objectMapper = new ObjectMapper();
//            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//            List<T> object = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
//            return object;
//        } catch (Exception e) {
//            log.warn("json2Object error, json = " + json, e);
//            return Collections.emptyList();
//        }
//    }
//
//    public static <T> List<T> json2ListWithException(String json, Class<T> clazz) throws Exception {
//        if (StringUtils.isBlank(json)) {
//            return Collections.emptyList();
//        }
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//        List<T> object = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
//        return object;
//    }
//
//    public static String object2Json(Object object) {
//        return object2Json(object, true);
//    }
//
//    public static String object2Json(Object object, boolean containNull) {
//        if (object == null) {
//            return "";
//        }
//        try {
//            return getInstance(containNull).writeValueAsString(object);
//        } catch (Exception e) {
//            log.error("object2Json", e);
//            return "";
//        }
//    }
//
//    public static Map json2Map(String json, boolean containNull) {
//        return json2Map(json);
//    }
//
//    private static ObjectMapper getInstance() {
//        // 默认情况都包含null
//        return getInstance(true);
//    }
//
//    private static ObjectMapper getInstance(boolean containsNull) {
//        ObjectMapper m = containsNull ? mapper : mapperWithoutNull;
//        if (m != null) {
//            return m;
//        }
//        synchronized (JsonUtil.class) {
//            if (m != null) {
//                return m;
//            }
//            m = getCommonMapper();
//            if (!containsNull) {
//                m.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//            }
//            return m;
//        }
//    }
//
//    private static ObjectMapper getCommonMapper() {
//        ObjectMapper mapper = new ObjectMapper();
//        // 兼容性Feature配置
//        mapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
//        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
//        mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true);
//        mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
//        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
//        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
//        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
//        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
//        // 兼容性：忽略未知字段
//        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//        // 注意，将时间序列化为类似“yyyy-MM-ddTHH:mm:ss.SSS+0000”的格式
//        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//        // 注意，默认在序列化结果中输出值为null的字段
//        return mapper;
//    }
//
//    private static <T> T readValue(String json, Type type) throws Exception {
//        if (StringUtils.isBlank(json)) {
//            return null;
//        }
//        ObjectMapper mapper = getInstance();
//        TypeFactory typeFactory = mapper.getTypeFactory();
//        JavaType javaType = typeFactory.constructType(type);
//        return mapper.readValue(json, javaType);
//    }
//}
